package a66weding.com.jiehuntong.common;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import java.util.List;

/**
 * 通用 Adapter 抽象类
 * Created by Administrator on 2016/1/30.
 */
public abstract class CommonAdapter<T> extends BaseAdapter {
    private Context context;
    List<T> dataList;
    int [] layoutIds;

    /**
     * 构造方法
     * @param context Context 对象
     * @param dataList List数据集合
     * @param layoutIds 布局ID, 至少设置一个
     */
    public CommonAdapter(Context context,List<T> dataList,int ... layoutIds){
        this.context=context;
        this.dataList=dataList;
        this.layoutIds=layoutIds;
    }

    /**
     * 获取 dataList 元素的数量, ListView 会根据其生成对应数量的 Item
     * @return
     */
    @Override
    public int getCount() {
        return dataList.size();
    }

    /**
     * 布局类型(数据类型)的数量, 会根布局类型生成相对应的 ViewHolder
     * @return count 布局类型(数据类型)的数量
     */
    @Override
    public int getViewTypeCount() {
        return layoutIds.length;
    }

    /**
     *获取对应位置的数据
     * @param position
     * @return 对应位置 Item 所需的数据
     */
    @Override
    public T getItem(int position) {
        return dataList.get(position);
    }

    /**
     * 使用分类型 ListView 时需要重写此方法, 返回对应的 Type,
     * Adapter 才可以根据此 Type 使用相应的 Item布局和 ViewHolder.
     * @param position 对应位置 Item 所需的数据
     * @return 默认 0, 数据的 Type
     *
     */
    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    /**
     * 根据指定的位置获取一个视图, 用于显示到 ListView 的一个Item中
     * @param position ListView 中 Item 在所在位置
     * @param convertView 被重用的指定类型的 View, 可能为 null
     * @param viewGroup  返回的 View 将要被绑定到的父视图
     * @return convertView 根据数据生成的视图对象
     */
    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        int layoutId = layoutIds[getItemViewType(position)];

        MyViewHolder holder=MyViewHolder.getHolder(context, convertView, layoutId);

        convert(holder,position);
        return holder.getConvertView();
    }

    /**
     * 设置视图数据的抽象方法
     * 如果使用了分类型 ListView, 需要重写 getItemViewType(position) 返回对应的Type值,
     * 且 getItemViewType(position) 返回的 Type 值需要是在 0 ~ getViewTypeCount() 之间.
     * @param holder 与布局类型对应的 ViewHolder 对象
     * @param position 当前要处理视图(数据)的位置
     */
    public abstract void convert(MyViewHolder holder,int position);


}
